//
//  TZWHomeTableViewController.swift
//  Sinaweibotzw
//
//  Created by 檀志文 on 16/4/8.
//  Copyright © 2016年 ios檀志文. All rights reserved.
//

import UIKit

import SVProgressHUD
import SVPullToRefresh

class TZWHomeTableViewController: TZWBaseTableViewController {
    
//  刷新控件
    private lazy var pullDownRefreshControl: TZWPullDownRefreshControl = TZWPullDownRefreshControl()
    
    // 微博模型
    var statuses: [TZWStatus]? {
        didSet {
            // 只要微博数据改变了就刷新微博数据
            HMPrint("总得微薄数据: \(statuses?.count)")
            self.tableView.reloadData()
        }
    }
    
    private let ReuseIdentifier = "ReuseIdentifier"
    
    override func viewDidLoad() {
        super.viewDidLoad()

//        用户没有登录不需要做以下操作
        if !TZWUserAccoutViewModel.sharedInstance.useLogin {
            return
        }
        
        setupNavigationBar()
        
        prepareTableView()
        
    }
    
    private func prepareTableView(){
        // 去掉分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        // 注册cell
        tableView.registerClass(TZWStatusCell.self, forCellReuseIdentifier: ReuseIdentifier)
        
        // 1.cell的高度设置为UITableViewAutomaticDimension
        tableView.rowHeight = UITableViewAutomaticDimension
        
        // 2.预估行高,等cell要显示的时候才回去计算真实的高度
        tableView.estimatedRowHeight = 200
        
        // 将刷新控件添加到tableView里面
        tableView.addSubview(pullDownRefreshControl)
        
        // 03.准备刷新的闭包
        pullDownRefreshControl.pullDownRefreshHandler = { () -> () in
            HMPrint("控制器开始下拉刷新")
            
            self.loadNewStatus()
        }
        
        // 让控件进入到刷新状态
        pullDownRefreshControl.startRefreshing()
        // 上拉加载更多
        tableView.addInfiniteScrollingWithActionHandler { () -> Void in
//            上拉加载数据
            HMPrint("上拉加载数据")
            self.loadMoreStatus()
        }

    }
    /// 上拉加载更多老的数据
    private func loadMoreStatus() {
        let max_id = self.statuses?.last?.id ?? 0
        if max_id == 0 {
            HMPrint("没有微博数据,不去上拉加载更多数据")
            return
        }
        // 加载比 max_id 还小得微博
        TZWStatusModel.sharedInstance.loadStatus(0, max_id: max_id) { (statuses, error) -> () in
            //            // 让刷新控件结束刷新
            self.tableView.infiniteScrollingView.stopAnimating()
        
            if error != nil{
                HMPrint("上拉加载更多微博数据失败了: \(error)")
                return

            }
            let count = statuses?.count ?? 0
            
            if count == 0{
                SVProgressHUD.showErrorWithStatus("没有加载更多的数据了")
                return
            }
            // 拼接数据,老得微博数据拼接到现有数据的后面
            let s = self.statuses! + statuses!
            self.statuses = s
            
        }
    }
    
    /// 加载新的微薄数据
    private func loadNewStatus(){
        
        
        let since_id = self.statuses?.first?.id ?? 0
        
        // 01.加载数据,准备了闭包,传递给了 loadStatus 的 loadStatusCallback
        TZWStatusModel.sharedInstance.loadStatus(since_id, max_id: 0) { (statuses, error) -> () in
            // 加载数据完成了.让刷新控件完成刷新
            self.pullDownRefreshControl.endRefreshing()
            if error != nil {
                HMPrint("获取微博数据失败了: \(error)")
                SVProgressHUD.showErrorWithStatus("您的网络不给力...")
                return
            }
            
            // 判断返回微博的数量
            let count = statuses?.count ?? 0
            HMPrint("加载了微薄数据: \(count)")
            
            // 如果是第一次加载20条,不需要显示
            if since_id != 0 {
                // 用户手动拖拽,显示下拉刷新的条数
                self.showTipLabel(count)
            }

            
            if count == 0 {
                HMPrint("没有加载到微博数据")
                
                if since_id == 0 {
                    SVProgressHUD.showErrorWithStatus("没有加载到微博数据")
                }
                return
            }
            // 加载微博成功,将微博数据保存起来,让tableView去显示
            // 判断,如果 since_id = 0
            if since_id == 0 {
                self.statuses = statuses
                // 第一次进来tableView没有数据since_id = 0 ,加载最新20条,有数据后才添加上拉加载更多这个功能
                self.tableView.addInfiniteScrollingWithActionHandler { () -> Void in
                    // 上拉加载数据
                    self.loadMoreStatus()
                }
            } else {
                // 如果since_id != 0, 将返回的数据拼接到现有数据前面
                // 数组直接使用加号拼接
                let s = statuses! + self.statuses!
                
                // 将拼接好的数据赋值给self.statuses
                self.statuses = s
            }
        }
    }
    
    //     /// 显示下拉数据提示
    /// count:更新数据的条数
    private func showTipLabel (count: Int){
                // label放到导航栏里面 y = -(状态栏的高度+自己的高度)
        
        let y = -(UIApplication.sharedApplication().statusBarFrame.height + TipLabelHeight)
        tipLabel.frame = CGRect(x: 0, y: y, width: UIScreen.mainScreen().bounds.width, height: TipLabelHeight)
//      设置文字的内容
        tipLabel.text = count == 0 ? "没有新的微博数据" : "下拉刷新了 \(count) 条微博数据"
//      添加到导航栏上面，addsubview 再最上面
        navigationController?.navigationBar.insertSubview(tipLabel, atIndex: 0)
        
        // label动画
        
        UIView.animateWithDuration(1, animations: { () -> Void in
            // UIView动画,反过来执行
            //            UIView.setAnimationRepeatAutoreverses(true)
            // UIView动画重复执行
            //            UIView.setAnimationRepeatCount(5)
            
            self.tipLabel.frame = CGRect(x: 0, y: TipLabelHeight, width: UIScreen.mainScreen().bounds.width, height: TipLabelHeight)
            }) { (_) -> Void in
                // 停一会,在动画到屏幕上面去
                // 返回回去的动画
                UIView.animateWithDuration(1, delay: 0.5, options: [], animations: { () -> Void in
                    self.tipLabel.frame = CGRect(x: 0, y: -(UIApplication.sharedApplication().statusBarFrame.height + TipLabelHeight), width: UIScreen.mainScreen().bounds.width, height: TipLabelHeight)
                    }, completion: { (_) -> Void in
                        HMPrint("动画完成了")
                        self.tipLabel.removeFromSuperview()
                })
        }

        
    }
    
    
    private func setupNavigationBar() {
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName : "navigationbar_friendsearch", target: self, action: Selector("didClickPerson:"))
        
        // 右边
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName : "navigationbar_pop", target: self, action: "didClickQRCode:")
        
        // title按钮
        let name = TZWUserAccoutViewModel.sharedInstance.userAccount?.screen_name ?? "没有名称"
        
        // title按钮
        let titleButton = TZWHomeTitleButton(title: name)
        titleButton .addTarget(self, action: Selector("didClickTitleButton:"), forControlEvents: UIControlEvents.TouchUpInside)
        navigationItem.titleView = titleButton
 }
    
    // MARK: - 按钮点击事件
    @objc private func didClickTitleButton(button: UIButton){
//        切换按钮的选中状态
        button.selected = !button.selected
        UIView.animateWithDuration(HMDefautlAnimDuration) { () -> Void in
            button.imageView?.transform = button.selected ? CGAffineTransformMakeRotation(CGFloat (M_PI - 0.001)) : CGAffineTransformIdentity
        }
    }
    
    @objc private func didClickPerson(button: UIButton) {
        HMPrint("button: \(button)")
    }
    
    @objc private func didClickQRCode(button: UIButton) {
        HMPrint("button: \(button)")
    }
    
    // MARK: - 下拉刷新数量label
    private lazy var tipLabel: UILabel = {
        let label = UILabel(fontSize: 14, textColor: UIColor.whiteColor())
        
        label.backgroundColor = UIColor.orangeColor()
        label.textAlignment = NSTextAlignment.Center
        
        // 只需要添加一次
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        
        return label
    }()
    
}
extension TZWHomeTableViewController {
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.statuses?.count ?? 0
    }
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifier, forIndexPath: indexPath) as! TZWStatusCell
        cell.status = self.statuses?[indexPath.row]
        return cell
    }
    /// cell不要高亮
    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return false
    }
}
